package top.jacktgq.candychat.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import top.jacktgq.candychat.netty.ChatHandler;
import top.jacktgq.candychat.netty.pojo.dto.DataContentDTO;
import top.jacktgq.candychat.netty.pojo.enums.MsgActionEnum;
import top.jacktgq.candychat.pojo.FriendsRequest;
import top.jacktgq.candychat.pojo.Userinfo;
import top.jacktgq.candychat.pojo.bo.UserinfoBO;
import top.jacktgq.candychat.pojo.enums.OperateFriendRequestTypeEnum;
import top.jacktgq.candychat.pojo.enums.SearchUserinfoStatusEnum;
import top.jacktgq.candychat.pojo.vo.UserinfoVO;
import top.jacktgq.candychat.service.UserinfoService;
import top.jacktgq.candychat.utils.CandyJsonResult;
import top.jacktgq.candychat.utils.CandyFileUtils;
import top.jacktgq.candychat.utils.FastDFSClient;
import top.jacktgq.candychat.utils.MD5Utils;

/**
 * @Author CandyWall
 * @Date 2021/2/8--18:50
 * @Description
 */
@RestController()
@RequestMapping("user")
public class UserinfoController {
    public static String base_path;    //获取用户登录的系统目录

    static {
        base_path = System.getProperty("user.home");
    }

    @Autowired
    private UserinfoService userinfoService;

    @Autowired
    private FastDFSClient fastDFSClient;

    @PostMapping("/registOrLogin")
    /**
     * 登录或注册
     */
    public CandyJsonResult registOrLogin(@RequestBody Userinfo userinfo) {
        // 判断用户名和密码是否为空
        if (StringUtils.isBlank(userinfo.getUsername()) || StringUtils.isBlank(userinfo.getPassword())) {
            return CandyJsonResult.errorMsg("用户名和密码都不能为空");
        }

        // 将密码再用MD5进行一次加密
        userinfo.setPassword(MD5Utils.getMD5Str(userinfo.getPassword()));
        if (!userinfoService.queryUsernameIfExist(userinfo.getUsername())) {
            // 账号不存在，就根据账号密码去注册新用户
            userinfoService.regist(userinfo);
        } else {
            // 账号存在，就去数据库中验证账号密码是否正确
            // 账号密码不正确
            userinfo = userinfoService.login(userinfo);
            if (userinfo == null) {
                return CandyJsonResult.errorMsg("密码错误");
            }
        }

        // 将登录或者注册后的用户对象信息返回
        UserinfoVO userinfoVO = new UserinfoVO();
        BeanUtils.copyProperties(userinfo, userinfoVO);

        return CandyJsonResult.ok(userinfoVO);
    }

    @PostMapping("/uploadFaceBase64")
    /**
     * 修改用户头像
     */
    public CandyJsonResult uploadFaceBase64(@RequestBody UserinfoBO userinfoBO) {
        // 获取前端传过来的Base64字符串，然后转换为文件对象再上传
        String base64Data = userinfoBO.getFaceData();
        String userFacePath = base_path + "/temp/tmp.jpg";
        // 返回值
        UserinfoVO result = new UserinfoVO();
        try {
            // 将文件保存到本地
            if (CandyFileUtils.base64ToFile(userFacePath, base64Data)) {
                // 保存本地成功就上传到fastdfs服务器
                MultipartFile faceFile = CandyFileUtils.fileToMultipart(userFacePath);
                // 上传成功会获取到一个文件id，这个id是原图id
                String imageId = fastDFSClient.uploadBase64(faceFile);
                System.out.println(imageId);
                // 缩略图ID基于原图ID会加上 长度 x 宽度的后缀，这里是 80 x 80，尺寸设置见application.properties
                // 获取缩略图的id
                String[] strs = imageId.split("\\.");
                String thumbImgId = strs[0] + "_80x80." + strs[1];

                //更新用户头像
                Userinfo userinfo = new Userinfo();
                userinfo.setId(userinfoBO.getUserId());
                userinfo.setFaceImageBig(imageId);
                userinfo.setFaceImage(thumbImgId);
                Userinfo updatedUserinfo = userinfoService.setFaceImageUrl(userinfo);
                BeanUtils.copyProperties(updatedUserinfo, result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return CandyJsonResult.ok(result);
    }

    @PostMapping("/setNickname")
    /**
     * 修改昵称
     */
    public CandyJsonResult setNickname(@RequestBody UserinfoBO userinfoBO) {
        Userinfo userinfo = new Userinfo();
        userinfo.setId(userinfoBO.getUserId());
        userinfo.setNickname(userinfoBO.getNickname());
        Userinfo result = userinfoService.setNickname(userinfo);

        return CandyJsonResult.ok(result);
    }

    @PostMapping("/searchUserinfo")
    /**
     * 搜索好友
     */
    public CandyJsonResult searchUserinfo(String myUserId, String friendUsername) {
        // 判断用户名和密码是否为空
        if (StringUtils.isBlank(myUserId) || StringUtils.isBlank(friendUsername)) {
            return CandyJsonResult.errorMsg("用户id和好友用户名都不能为空");
        }
        Userinfo userinfo = new Userinfo();
        // 前置条件查询
        // 1、搜索的用户不存在，返回[无此用户]
        // 2、搜索的用户是你自己，返回不能[添加自己]
        // 3、搜索的用户已经是我的好友，返回[该用户已经是你的好友]
        Object result = userinfoService.preconditionSearchUserinfo(myUserId, friendUsername);
        // 如果查询的用户符合添加好友的条件，返回用户信息
        if (result instanceof Userinfo) {
            UserinfoVO userinfoVO = new UserinfoVO();
            BeanUtils.copyProperties(result, userinfoVO);
            return CandyJsonResult.ok(userinfoVO);
        }
        // 如果不符合，就返回错误信息
        else {
            int status = (int) result;
            String errorMsg = SearchUserinfoStatusEnum.getMsgByKey(status);
            return CandyJsonResult.errorMsg(errorMsg);
        }
    }

    @PostMapping("/addFriendRequest")
    /**
     * 添加好友
     */
    public CandyJsonResult addFriendRequest(String myUserId, String friendUserId, String friendUsername) {
        // 判断用户账号、好友账号和用户名是否为空
        if (StringUtils.isBlank(myUserId) || StringUtils.isBlank(friendUserId) || StringUtils.isBlank(friendUsername)) {
            return CandyJsonResult.errorMsg("用户id、好友id和用户名都不能为空");
        }
        Userinfo userinfo = new Userinfo();
        // 前置条件查询
        // 1、搜索的用户不存在，返回[无此用户]
        // 2、搜索的用户是你自己，返回不能[添加自己]
        // 3、搜索的用户已经是我的好友，返回[该用户已经是你的好友]
        Object result = userinfoService.preconditionSearchUserinfo(myUserId, friendUsername);
        // 如果查询的用户符合添加好友的条件，返回用户信息
        if (result instanceof Userinfo) {
            userinfoService.sendFriendRequest(myUserId, friendUserId);
        }
        // 如果不符合，就返回错误信息
        else {
            int status = (int) result;
            String errorMsg = SearchUserinfoStatusEnum.getMsgByKey(status);
            return CandyJsonResult.errorMsg(errorMsg);
        }
        return CandyJsonResult.ok();
    }

    @PostMapping("/queryFriendRequestList")
    /**
     * 添加好友
     */
    public CandyJsonResult queryFriendRequestList(String acceptUserId) {
        // 判断用户ID是否为空
        if (StringUtils.isBlank(acceptUserId)) {
            return CandyJsonResult.errorMsg("用户ID不能为空");
        }
        return CandyJsonResult.ok(userinfoService.queryFriendRequestList(acceptUserId));
    }

    @PostMapping("/operateFriendRequest")
    /**
     * 处理好友请求：接受方通过、拒绝或者忽略朋友请求
     * requestStatus ：操作类型（1：已接受，2：已拒绝，3：已忽略）
     */
    public CandyJsonResult operateFriendRequest(@RequestBody FriendsRequest friendsRequest) {
        // 判断用户账号和好友用户名是否为空
        if (StringUtils.isBlank(friendsRequest.getAcceptUserId()) || StringUtils.isBlank(friendsRequest.getSendUserId())) {
            return CandyJsonResult.errorMsg("用户id和好友id都不能为空");
        }

        if (StringUtils.isBlank(OperateFriendRequestTypeEnum.getMsgByType(friendsRequest.getRequestStatus()))) {
            return CandyJsonResult.errorMsg("请求状态必须是1，2，3中的一种");
        }

        // 通过请求，并且返回最新的好友列表信息
        if (friendsRequest.getRequestStatus() == OperateFriendRequestTypeEnum.PASS.getType()) {
            // 使用Websocket主动推送消息到请求发起者，更新他的通讯录为最新
            DataContentDTO dataContentDTO = new DataContentDTO(MsgActionEnum.PULL_FRIENDS.type);
            ChatHandler.sendMsg(friendsRequest.getSendUserId(), dataContentDTO);

            return CandyJsonResult.ok(userinfoService.passFriendRequest(friendsRequest));
        }
        // 忽略或者拒绝请求
        else {
            userinfoService.operateFriendRequest(friendsRequest);
        }

        return CandyJsonResult.ok();
    }

    @PostMapping("/getMyFriends")
    /**
     * 加载通讯录：查询我的所有朋友
     */
    public CandyJsonResult getMyFriends(String userId) {
        // 判断用户id是否为空
        if (StringUtils.isBlank(userId)) {
            return CandyJsonResult.errorMsg("用户id不能为空");
        }

        return CandyJsonResult.ok(userinfoService.getMyFriendsByUserId(userId));
    }

    @PostMapping("/getUnsignedMsgListByUserId")
    /**
     * 用户手机端获取未签收的消息列表
     */
    public CandyJsonResult getUnsignedMsgListByUserId(String userId) {
        // 判断用户id是否为空
        if (StringUtils.isBlank(userId)) {
            return CandyJsonResult.errorMsg("用户id不能为空");
        }

        return CandyJsonResult.ok(userinfoService.getUnsignedMsgListByUserId(userId));
    }
}